El paso de parámetros por valor y por referencia

Paso por valor

El paso por valor se utiliza en muchos lenguajes de programación; por ejemplo, C, Modula-2, Pascal, Algol y Snobol. La razón de su popularidad es la analogía con los argumentos de una función, donde los valores se proporcionan en el orden de cálculo de resultados. Los parámetros se tratan como variables locales y los valores iniciales se proporcionan copiando los valores de los correspondientes argumentos.

Los parámetros formales -locales a la función- recibe como valores iniciales los valores de los parámetros actuales y con ello se ejecutan las acciones descritas en el subprograma.

No se hace diferencia entre un argumento que es variable, constante o expresión, ya que sólo importa el valor del argumento.

Aunque el paso por valor es sencillo, tiene una limitación acusada: no existe ninguna otra conexión con los parámetros actuales, y entonces los cambios que se produzcan por efecto del subprograma no producen cambios en los argumentos originales y, por consiguiente, no se pueden pasar valores de retorno al punto de llamada: es decir, todos los parámetros son sólo de entrada. El parámetro actual no puede modificarse por el subprograma. Cualquier cambio realizado en los valores de los parámetros formales durante la ejecución del subprograma se destruye cuando se termina el subprograma.

La llamada por valor no devuelve información al programa que llama. "

Existe una variante de la llamada por valor y es la llamada por valor resultado. Las variables indicadas por los parámetros formales se inicializan en la llamada al subprograma por valor tras la ejecución del subprograma; los resultados (valores de los parámetros formales) se transfieren a los actuales. Este método se utiliza en algunas versiones de FORTRAN.

Paso por referencia

En numerosas ocasiones se requiere que ciertos parámetros sirvan como parámetros de salida, es decir, se devuelvan los resultados a la unidad o programas que llama. Este método se denomina paso por referencia o también de llamada por dirección o variable. La unidad que llama pasa a la unidad llamada la dirección del parámetro actual (que está en el ámbito de la unidad llamante). Una referencia al correspondiente parámetro formal se trata como una referencia a la posición de memoria! cuya dirección se ha pasado. Entonces una variable pasada como parámetro real es compartida, es decir, se puede modificar directamente por el subprograma.

Este método existe en FORTRAN, COBOL, Modula-2, Pascal, PA y Algol 68. La característica de este método se debe a su simplicidad y su analogía directa con la idea de que las variables tienen una posición de memoria asignada-desde la cual se pueden obtener o actualizar sus valores.

El área de almacenamiento (direcciones de memoria) se utiliza para pasar información de entrada y/o salida; en ambas direcciones.

En este método los parámetros son de entrada/salida y los parámetros se denominan parámetros variables.

Los parámetros valor y parámetros variable se suelen definir en la cabecera del subprograma. En el caso de lenguajes como Pascal, los parámetros variables deben ir precedidos por la palabra clave var; La primera llamada en (1) produce que los parámetros a y c sean sustituidos por x e y si los valores de x e y se modifican dentro de a o e en el algoritmo principal. De igual modo, b y d son sustituidos por x e y, y cualquier modificación de x o y en el procedimiento afectará también al programa principal, La llamada por referencia es muy útil para programas donde se necesita la comunicación del valor en ambas direcciones.

NOTAS

Ambos métodos de paso de parámetros se aplican tanto a la llamada defunciones como a las de procedimientos:

Que es un array unidimensional o vector

ARRAYS UNIDIMENSIONALES: LOS VECTORES

Un array (matriz o vector) es un conjunto finito y ordenado de elementos homogéneos. La propiedad «ordenada» significa que el elemento primero, segundo, tercero, ..., enésimo de un array puede ser identificado. Los elementos de un array son homogéneos, es decir, del mismo tipo de datos. Un array puede estar compuesto de todos sus elementos de tipo cadena, otro puede tener todos sus elementos de tipo entero, etc. Los arrays se conocen también como matrices--en matemáticas- y tablas –en cálculos financieros-.

El subíndice o índice de un elemento (1, 2, ... , i, n) designa su posición en la ordenación del vector. Otras posibles notaciones del vector son:

A(l), A(2), …, A(i), …, A(n) en matemáticas y algunos. lenguajes (VB 6.0 y VB.Net)

A(l), A(2), …, A(i), …, A(n) A[n] en programación (Pascal y C)

Los vectores se almacenan en la memoria central de la computadora en un orden adyacente. Así, un vector de cincuenta números denominado NÚMEROS se representa gráficamente por cincuenta posiciones de memoria sucesivas.

Cada elemento de un vector se puede procesar como si fuese una variable simple al ocupar una posición de memoria. Así, NUMEROS[25] <- 72 almacena el valor entero o real 72 en la posición 25. " del vector NÚMEROS y la instrucción de salida escribir (NÚMEROS[25]) visualiza el valor almacenado en la posición 2S:, en este caso 72.

Esta propiedad significa que cada elemento de un vector-y posteriormente una tabla o matriz- es accesible directamente y es una de las ventajas más importantes de usar un vector: almacenar un conjunto de datos.

Los arrays unidimensionales, al igual que posteriormente se verán los arrays multidimensionales, necesitan ser dimensionados previamente a su uso dentro de un programa.

Que es un array bidimensional o matriz

Los vectores examinados hasta ahora se denominan arrays unidimensionales y en ellos cada elemento se define o referencia por un índice o subíndice. Estos vectores son elementos de datos escritos en una secuencia. Sin embargo, existen grupos de datos que son representados mejor en forma de tabla o matriz con dos o más subíndices. Ejemplos típicos de tablas o matrices son: tablas de distancias kilométricas entre ciudades, cuadros horarios de trenes o aviones, informes de ventas periódicas (mes/unidades vendidas o bien més/ventas totales), etc. Se pueden definir tablas o matrices como arrays multidimensionales, cuyos elementos se pueden referenciar por dos, tres o más subíndices. Los arrays no unidimensionales los dividiremos en dos grandes grupos:

arrays bidimensionales(2 dimensiones)

arrays multidimensionales (3 o más dimensiones)

Arrays bidimensionales (tablas/matrices)

El array bidimensional se puede considerar como un vector de vectores. Es, por consiguiente, un conjunto de elementos, todos del mismo tipo, en el cual el orden de los componentes es significativo y en el que se necesita especificar dos subíndices para poder identificar cada elemento del array.

Sí se visualiza un array unidimensional, se puede considerar como una columna de datos; un array bidimensional es un grupo de columnas, como se ilustra en la Figura 7.3.

El diagrama representa una tabla o matriz de treinta elementos (5x6) con 5 filas y 6 columnas.

Como en un vector de treinta elementos, cada uno de ellos tiene el mismo nombre. Sin embargo, un subíndice no es suficiente para especificar un elemento de un array bidimensional; por ejemplo, si el nombre del array es M, no se puede indicar M[3],. ya que no sabemos si es el tercer elemento de la primera fila o de la primera columna. Para evitar la ambigüedad, los elementos de un array bidimensional se referencian con dos subíndices: el primer subíndice se refiere a la fila y el segundo subíndice se refiere a la columna. Por consiguiente, M[2, 3] se refiere al elemento de la segunda fila, tercera columna. En nuestra tabla ejemplo M[2, 3] contiene el valor 18.

Un array bidimensional M, también denominado matriz (términos matemáticos) o tabla (términos financieros), se considera que tiene dos dimensiones (una dimensión por cada subíndice) y necesita. Un valor para cada subíndice para poder identificar un elemento individual. En notación estándar, normalmente el primer subíndice se refiere a la fila del array, mientras que el segundo subíndice se refiere a la columna del array, Es decir, B [1, J] es el elemento de B que ocupa la fila y la J° columna, como se indica en la Figura 7.4.

El elemento B[1 ,J] también se puede representar por B1, J. Más formalmente en notación algorítmica, el array B con elementos del tipo T (numéricos, alfanuméricos, etc.) con subíndices fila que varían en el rango de 1 a M y subíndices columna en el rango de 1 a N es !

B(l:M, l:N) = {B[I, J]}

Donde 1 == 1, ¡ M o bien 1 <= 1 <= M

J = 1, r N 1 <= J <==N

Cada elemento B [1, J] es de tipo T.

El array B se dice que tiene M por N elementos. Existen N elementos en cada fila y M elementos en cada columna (M*N).

En general, se considera que un array bidimensional comienza sus subíndices en 0 o en 1 (según el lenguaje de programación, O en el lenguaje e, 1 en FORTRAN), pero pueden tener límites seleccionados por el usuario durante la codificación del algoritmo. En general, el array bidimensional B con su primer subíndice, variando desde un límite inferior L (inferior, low) a un límite superior Y (superior, up). En notación algorítmica

B(L1:U1, L2:U2) = {B[I, J]}

Donde L1 <= 1 <= U1

L2 <= J <= U2

Cada elemento B[ 1, J] es del tipo T.

El número de elementos de una fila de B es U2-L2+1 y el número de elementos en una columna de B es U1-L1+1. Por consiguiente, el número total de elementos del array B es (U2-L2+1)*(UI-Ll+1).

ARRAYS MULTIDIMENSIONALES

Un array puede ser definido de tres dimensiones, cuatro dimensiones, hasta de dimensiones. Los conceptos de rango de subíndices y número de elementos ,se pueden ampliar directamente desde arrays de una y dos dimensiones a estos arrays de orden más alto. En general, un array de n-dimensiones requiere que los valores de los n subíndices puedan ser especificados a fin de identificar un elemento individual del array. Si cada componente de un array tiene subíndices, el array se dice que es sólo de n-dimensiones. El array A de n-dimensiones se puede identificar como

A(Ll:U1, L2:U2, ... Ln:Un)

y un elemento individual del array se puede especificar por

A(I1, I2, …, In)

donde cada subíndice Ik está dentro de los límites adecuados

Lk <= Ik <= Uk donde k = 1, 2, ... r n

El número total de elementos de un array A es

∏(Uk-Lk,+l) ∏ (símbolo del producto)

que se puede escribir alternativamente como

(U1-L1,+l) * (U2-L2+1) * ... * (UN-LN+l)

Si los mites inferiores comenzasen en 1, el array se representaría por

A(K1, K2, …, Kn) o bien Ak1, k2, …, kn

donde

1 <= K1, <= S1

1 <= K2 <= S2

1 <= Kn <= Sn